﻿using Microsoft.VisualStudio.TestTools.UnitTesting;
using Negocio = PSE.Tools.CadastroMensagens.Negocio;
using Entidades = PSE.Tools.CadastroMensagens.Entidades;
using PSE.Tools.Util.Entidades;
using System;
using System.Linq;
using System.Text;

namespace CadastroMensagensTest
{
    [TestClass()]
    public class TiposMensagemTest
    {
        #region [ Inserir ]
        [TestMethod]
        public void InsereTipoMensagemComEntidadeNula()
        {
            bool ok = false;
            Negocio.TiposMensagens negocio = new Negocio.TiposMensagens();
            try
            {
                negocio.Inserir(null);
            }
            catch (System.ArgumentNullException)
            {
                ok = true;
            }
            Assert.IsTrue(ok);
        }

        [TestMethod]
        public void InsereTipoMensagemComDescricaoComMaisDe30Caracteres()
        {
            bool ok = false;
            Negocio.TiposMensagens negocio = new Negocio.TiposMensagens();
            try
            {
                Entidades.TipoMensagem TipoMensagem = new Entidades.TipoMensagem();
                TipoMensagem.Descricao = StringUtil.RetornaTextoAleatorio(35);
                negocio.Inserir(TipoMensagem);
            }
            catch (ValidacaoEntidadeException ex)
            {
                ok = ex.Validacoes.First().NomePropriedade.Equals("Descricao", System.StringComparison.CurrentCultureIgnoreCase);
            }
            Assert.IsTrue(ok);
        }

        [TestMethod]
        public void InsereTipoMensagemComDescricaoVazia()
        {
            bool ok = false;
            Negocio.TiposMensagens negocio = new Negocio.TiposMensagens();
            try
            {
                Entidades.TipoMensagem TipoMensagem = new Entidades.TipoMensagem();
                TipoMensagem.Descricao = "";
                negocio.Inserir(TipoMensagem);
            }
            catch (ValidacaoEntidadeException ex)
            {
                ok = ex.Validacoes.First().NomePropriedade.Equals("Descricao", System.StringComparison.CurrentCultureIgnoreCase);
            }
            Assert.IsTrue(ok);
        }

        [TestMethod]
        public void InsereTipoMensagemComDescricaoJaCadastrada()
        {
            bool ok = false;
            Negocio.TiposMensagens negocio = new Negocio.TiposMensagens();
            var entidadeJaExistente = negocio.Selecionar()[0];
            Entidades.TipoMensagem entidadeNova = new Entidades.TipoMensagem { Descricao = entidadeJaExistente.Descricao };
            try
            {
                negocio.Inserir(entidadeNova);
            }
            catch (ValidacaoEntidadeException ex)
            {
                ok = ex.Validacoes.First().NomePropriedade.Equals("Descricao");
            }
            Assert.IsTrue(ok);
        }

        [TestMethod]
        public void InsereTipoMensagemComSucesso()
        {
            bool ok = true;
            Negocio.TiposMensagens negocio = new Negocio.TiposMensagens();
            Entidades.TipoMensagem entidadeNova = new Entidades.TipoMensagem { Descricao = StringUtil.RetornaTextoAleatorio(30) };
            try
            {
                negocio.Inserir(entidadeNova);
            }
            catch (Exception)
            {
                ok = false;
            }
            Assert.IsTrue(ok);
        }
        #endregion [ Inserir ]

        #region [ Atualizar ]
        [TestMethod]
        public void AtualizaTipoMensagemComEntidadeNula()
        {
            bool ok = false;
            Negocio.TiposMensagens negocio = new Negocio.TiposMensagens();
            try
            {
                negocio.Atualizar(null);
            }
            catch (System.ArgumentNullException)
            {
                ok = true;
            }
            Assert.IsTrue(ok);
        }
        [TestMethod]
        public void AtualizaTipoMensagemComDescricaoVazia()
        {
            bool ok = false;
            Negocio.TiposMensagens negocio = new Negocio.TiposMensagens();
            try
            {
                Entidades.TipoMensagem TipoMensagem = negocio.Selecionar()[0];
                TipoMensagem.Descricao = "";
                negocio.Atualizar(TipoMensagem);
            }
            catch (ValidacaoEntidadeException ex)
            {
                ok = ex.Validacoes.First().NomePropriedade.Equals("Descricao", System.StringComparison.CurrentCultureIgnoreCase);
            }
            Assert.IsTrue(ok);
        }

        [TestMethod]
        public void AtualizaTipoMensagemComDescricaoComMaisDe30Caracteres()
        {
            bool ok = false;
            Negocio.TiposMensagens negocio = new Negocio.TiposMensagens();
            try
            {
                Entidades.TipoMensagem TipoMensagem = negocio.Selecionar()[0];
                TipoMensagem.Descricao = StringUtil.RetornaTextoAleatorio(35);
                negocio.Atualizar(TipoMensagem);
            }
            catch (ValidacaoEntidadeException ex)
            {
                ok = ex.Validacoes.First().NomePropriedade.Equals("Descricao", System.StringComparison.CurrentCultureIgnoreCase);
            }
            Assert.IsTrue(ok);
        }

        [TestMethod]
        public void AtualizaTipoMensagemComDescricaoJaCadastrada()
        {
            bool ok = true;
            Negocio.TiposMensagens negocio = new Negocio.TiposMensagens();
            Entidades.TipoMensagem TipoMensagem1 = negocio.Selecionar()[0];
            Entidades.TipoMensagem TipoMensagem2 = negocio.Selecionar()[1];
            TipoMensagem2.Descricao = TipoMensagem1.Descricao;
            try
            {
                negocio.Atualizar(TipoMensagem2);
            }
            catch (ValidacaoEntidadeException ex)
            {
                ok = ex.Validacoes.First().NomePropriedade.Equals("Descricao");
            }
            Assert.IsTrue(ok);
        }

        [TestMethod]
        public void AtualizaTipoMensagemComSucesso()
        {
            bool ok = true;
            Negocio.TiposMensagens negocio = new Negocio.TiposMensagens();
            Entidades.TipoMensagem TipoMensagem1 = negocio.Selecionar()[0];
            try
            {
                negocio.Atualizar(TipoMensagem1);
            }
            catch (Exception)
            {
                ok = false;
            }
            Assert.IsTrue(ok);
        }
        #endregion [ Atualizar ]

        #region [ Excluir ]
        [TestMethod]
        public void ExcluirTipoMensagemNulo()
        {
            bool ok = false;
            Negocio.TiposMensagens negocio = new Negocio.TiposMensagens();
            try
            {
                negocio.Excluir(null);
            }
            catch (ArgumentNullException)
            {
                ok = true;
            }
            catch (Exception)
            {
                ok = false;
            }
            Assert.IsTrue(ok);
        }

        [TestMethod]
        public void ExcluirTipoMensagemComSucesso()
        {
            bool ok = false;
            Negocio.TiposMensagens negocio = new Negocio.TiposMensagens();
            int id = negocio.Selecionar().Count + 1;
            Entidades.TipoMensagem entidadeNova = new Entidades.TipoMensagem { Id = id, Descricao = StringUtil.RetornaTextoAleatorio(30) };
            try
            {
                negocio.Inserir(entidadeNova);
                var entidade = negocio.ObterPorId(id);
                negocio.Excluir(entidade);
                entidade = negocio.ObterPorId(id);
                ok = (entidade == null);
            }
            catch (Exception)
            {
                ok = false;
            }
            Assert.IsTrue(ok);
        }
        #endregion [ Excluir ]

        #region [ Obter ]
        [TestMethod]
        public void ObterTipoMensagemComIdVazio()
        {
            bool ok = false;
            Negocio.TiposMensagens negocio = new Negocio.TiposMensagens();
            try
            {
                var TipoMensagem = negocio.ObterPorId(0);
            }
            catch (ArgumentException)
            {
                ok = true;
            }
            Assert.IsTrue(ok);
        }

        [TestMethod]
        public void ObterTipoMensagemComSucesso()
        {
            bool ok = true;
            Negocio.TiposMensagens negocio = new Negocio.TiposMensagens();
            int id = negocio.Selecionar().Count + 1;
            Entidades.TipoMensagem entidadeNova = new Entidades.TipoMensagem { Id = id, Descricao = StringUtil.RetornaTextoAleatorio(30) };
            try
            {
                negocio.Inserir(entidadeNova);
                var entidade = negocio.ObterPorId(id);
                ok = (entidade != null);
            }
            catch (Exception)
            {
                ok = false;
            }
            Assert.IsTrue(ok);
        }
        #endregion [ Obter ]

        #region [ Selecionar ]
        [TestMethod]
        public void SelecionarTipoMensagemComSucesso()
        {
            bool ok = true;
            Negocio.TiposMensagens negocio = new Negocio.TiposMensagens();
            int id = negocio.Selecionar().Count + 1;
            Entidades.TipoMensagem entidadeNova = new Entidades.TipoMensagem { Id = id, Descricao = StringUtil.RetornaTextoAleatorio(30) };
            try
            {
                negocio.Inserir(entidadeNova);
                var entidade = negocio.ObterPorId(id);
                ok = negocio.Selecionar().Count > 0;
            }
            catch (Exception)
            {
                ok = false;
            }
            Assert.IsTrue(ok);
        }

        [TestMethod]
        public void SelecionarTipoMensagemComFiltroInvalido()
        {
            bool ok = false;
            Negocio.TiposMensagens negocio = new Negocio.TiposMensagens();
            try
            {
                var entidades = negocio.Selecionar(null);
            }
            catch (ArgumentNullException)
            {
                ok = true;
            }
            Assert.IsTrue(ok);
        }

        [TestMethod]
        public void SelecionarTipoMensagemComFiltroPeloNome()
        {
            bool ok = true;
            Negocio.TiposMensagens negocio = new Negocio.TiposMensagens();
            int id = negocio.Selecionar().Count + 1;
            string descricao = StringUtil.RetornaTextoAleatorio(30);
            Entidades.TipoMensagem entidadeNova = new Entidades.TipoMensagem { Id = id, Descricao = descricao };
            try
            {
                negocio.Inserir(entidadeNova);
                var entidades = negocio.Selecionar(i => i.Descricao.Equals(descricao));
                ok = entidades.Count == 1;
            }
            catch (Exception)
            {
                ok = false;
            }
            Assert.IsTrue(ok);
        }
        #endregion [ Selecionar ]
    }
}
